﻿#include "StdAfx.h"
#include "MemPoolUnit.h"
#include "MemBlock.h"

CMemBlock::CMemBlock(int unitSize, int unitCount)
	: m_totalUnitCount(unitCount),  //当前块总的单元数
	m_unitSize(unitSize),			//每个单元的大小
	m_freeUnitCount(unitCount)		//初始全部可用
{
	int		i;
	char	* p;
	// 申请内存，每个内存单元hold一块内存
	m_blockSize = unitSize * unitCount;		//计算当前要分配的块的大小。(字节)
	m_pbuffer = new char[m_blockSize];		//分配所需要的字节。每个对象大小：unitSize，数量是：unitCount

	// 初始化空闲块列表
	p = m_pbuffer;
	for (i = 0; i < m_totalUnitCount; i++)
	{
		m_freeUnits.AddTail(p); //初始全部空闲
		p += m_unitSize;
	}
}

CMemBlock::~CMemBlock(void)
{
	delete[]m_pbuffer;	//删除内存数组
}
//这里应该是一定能分配到的，当前块是否已经满，是由上一级来保证的。
void CMemBlock::alloc(CMemPoolUnit	**pUnit)
{
	// 不应已满
	ASSERT(!isFull());

	// 从当前块的空闲内存单元列表中拿出一个
	*pUnit = static_cast<CMemPoolUnit *>(m_freeUnits.RemoveHead());

	auto pAddressStart = *pUnit;
	//memset(((char *)(*pUnit)) + sizeof(CMemPoolUnit), 0, m_unitSize - sizeof(CMemPoolUnit));
   //将当前单元内存，全部置0。
	auto unitsize = sizeof(CMemPoolUnit);
	pAddressStart += 1;
	memset(pAddressStart, 0, m_unitSize - sizeof(CMemPoolUnit));
	m_freeUnitCount--;
}

void CMemBlock::free(CMemPoolUnit * pUnit)
{

	// 应从属于本块
	ASSERT(reinterpret_cast<char *>(pUnit) >= m_pbuffer && reinterpret_cast<char *>(pUnit) < m_pbuffer + m_blockSize);

	// 放入空闲块列表
	m_freeUnits.AddTail(pUnit);
	m_freeUnitCount++;
}